package co.gov.medellin.ssti.sub.model.dao.impl;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.support.GeneratedKeyHolder;

import co.gov.medellin.ssti.sub.model.dao.SubprogramaDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.web.form.SubprogramaForm;

public class SubprogramaDAOImpl2 extends NamedParameterJdbcDaoSupport implements
		SubprogramaDAO {

	// **************************************
	// QUERYS
	// **************************************

	private static final String SELECT_TODOS_SUBPROGRAMAS = "SELECT DISTINCT CODIGO, NOMBRE, DESCRIPCION, DIAS_REUTILIZAR, "
			+ "GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD,  VALIDAR_CONTRA_SISBEN, "
			+ "DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
			+ "DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, COD_CATEGORIA, "
			+ "NOM_CATEGORIA, COD_AREA FROM VCS_BEN_SUBPROG_ALLOWED "
			+ "WHERE VIGENCIA = 'A' ORDER BY NOMBRE ";

	private static final String SELECT_BY_PROGRAMA = "SELECT DISTINCT CODIGO, NOMBRE, DESCRIPCION, DIAS_REUTILIZAR, "
			+ "GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD,  VALIDAR_CONTRA_SISBEN, "
			+ "DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
			+ "DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, COD_CATEGORIA, "
			+ "NOM_CATEGORIA, COD_AREA FROM VCS_BEN_SUBPROG_ALLOWED "
			+ "WHERE VIGENCIA = 'A' AND COD_PROGRAMA = :COD_PROGRAMA ORDER BY NOMBRE ";

	private static final String SELECT_GESTOR = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
			+ "OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, VIGENCIA, "
			+ "TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
			+ "WHERE UPPER(TRIM(NOMBRE)) = 'GESTOR' AND SBPR_CODIGO = :SBPR_CODIGO ";

	private static final String SELECT_GF_FROM_TCS_BEN_SUBPROG_BY_CODESUBP = "SELECT GRUPO_FAMILIAR FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO = :CODIGO AND GRUPO_FAMILIAR='S'";

	private static final String PCS_BEN_UPDATE_BOT = "PCS_BEN_UPDATE_BOT";

	private static final String PCS_BEN_UPDATE_BOT_NEWTP = "PCS_BEN_UPDATE_BOT_NEWTP";

	public List<SubprogramaVO> loadAllSubprogramas() {

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.getJdbcOperations().query(SELECT_TODOS_SUBPROGRAMAS,
						new RowMapper<SubprogramaVO>() {

							public SubprogramaVO mapRow(ResultSet rst,
									int rowNum) throws SQLException {
								SubprogramaVO vo = new SubprogramaVO();
								vo.setCode(rst.getLong("CODIGO"));
								vo.setNombre(rst.getString("NOMBRE"));
								return vo;
							}
						});
		return subprogramas;
	}

	public List<SubprogramaVO> loadAllSubprogramasByPrograma(String programaCode) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		namedParameters.put("COD_PROGRAMA", programaCode);

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(SELECT_BY_PROGRAMA, namedParameters,
						new RowMapper<SubprogramaVO>() {

							public SubprogramaVO mapRow(ResultSet rs, int rowNum)
									throws SQLException {
								SubprogramaVO vo = new SubprogramaVO();
								vo.setCode(new Long(rs.getLong("CODIGO")));
								vo.setNombre(rs.getString("NOMBRE"));
								return vo;
							}
						});
		return subprogramas;
	}

	public Collection<SubprogramaVO> findCodeSubprogramasByCodePrograma(
			Long codePrograma) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = " SELECT sub.codigo codigo, sub.nombre nombre "
				+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog "
				+ " WHERE sub.PRG_CODIGO = prog.CODIGO AND prog.codigo = :prog.codigo ";

		namedParameters.put("prog.codigo", codePrograma);

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query, namedParameters, new RowMapper<SubprogramaVO>() {

					public SubprogramaVO mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						SubprogramaVO vo = new SubprogramaVO();
						vo.setCode(new Long(rs.getLong("CODIGO")));
						vo.setNombre(rs.getString("NOMBRE"));
						return vo;
					}
				});
		return subprogramas;
	}

	// TODO: tststst
	public AtributoVO getGestor(String codeSubprograma) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		AtributoVO gestor = null;

		namedParameters.put("SBPR_CODIGO", codeSubprograma);

		try {
			gestor = getNamedParameterJdbcTemplate().queryForObject(
					SELECT_GESTOR, namedParameters,
					new RowMapper<AtributoVO>() {

						public AtributoVO mapRow(ResultSet rs, int rowNum)
								throws SQLException {
							// TODO Auto-generated method stub
							AtributoVO gestor = new AtributoVO();
							gestor.setCodigo(rs.getString("CODIGO"));
							gestor.setCodatributo(rs.getString("CODIGO"));
							gestor.setValorsugerido(rs
									.getString("VALOR_SUGERIDO"));
							gestor.setTipovalorflex(rs
									.getString("TTVF_CODIGO_DOMINIO"));

							String strdominio = rs.getString("VALIDAR_LISTA");
							if (strdominio.equals("S")) {
								// gestor.setValoresflexibles(llenarLista(atr));
								// gestor.setDesvalorsugerido(getDesVFL(atr));
							}
							return gestor;
						}
					});
		} catch (IncorrectResultSizeDataAccessException e) {
			return gestor;
		}
		return gestor;
	}

	public Collection<SubprogramaVO> findSubprogramaByCriteria(
			SubprogramaVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "SELECT subpro.CODIGO,subpro.NOMBRE, subpro.DESCRIPCION, "
				+ " subpro.DIAS_REUTILIZAR, subpro.GRUPO_FAMILIAR, subpro.VALIDAR_CONTRA_ESTUD, "
				+ " subpro.VALIDAR_CONTRA_SISBEN, subpro.DIRECCION_BEN_OBLIGATORIA, nvl(subpro.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
				+ " subpro.DESDE_VIGENCIA, subpro.HASTA_VIGENCIA, subpro.VIGENCIA, pro.CODIGO COD_PROGRAMA, "
				+ " pro.NOMBRE NOM_PROGRAMA, usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, "
				+ " vflex.CODIGO COD_CATEGORIA, vflex.DESCRIPCION NOM_CATEGORIA "
				+ " FROM TCS_BEN_SUBPROGRAMA subpro, "
				+ " TCS_BEN_PROGRAMA pro, "
				+ " paoyer.TCS_USUARIO usu, "
				+ " paoyer.TCS_VALOR_FLEXIBLE vflex "
				+ " WHERE subpro.PRG_CODIGO = pro.CODIGO "
				+ " AND subpro.USU_CODIGO = usu.CODIGO "
				+ " AND vflex.CODIGO (+)= subpro.VFL_CODIGO_CATEGORIA ";

		StringBuffer query = new StringBuffer(strSql);

		if (criteria.getCode() != null) {
			query.append(" AND subpro.CODIGO = :subpro.CODIGO ");
			namedParameters.put("subpro.CODIGO", criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append(" AND subpro.NOMBRE LIKE :subpro.NOMBRE ");
			namedParameters.put("subpro.NOMBRE", "%"
					+ criteria.getNombre().toUpperCase().trim() + "%");
		}
		if (criteria.getCodePrograma() != null) {
			query.append(" AND pro.CODIGO = :pro.CODIGO ");
			namedParameters.put("pro.CODIGO", criteria.getCodePrograma());
		}
		query.append(" ORDER BY subpro.NOMBRE");

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<SubprogramaVO>() {

							public SubprogramaVO mapRow(ResultSet rs, int rowNum)
									throws SQLException {
								SubprogramaVO vo = new SubprogramaVO();
								vo.setCode(new Long(rs.getLong("CODIGO")));
								vo.setNombre(rs.getString("NOMBRE"));
								vo.setDescripcion(rs.getString("DESCRIPCION"));
								vo.setDiasReutilizar(rs
										.getString("DIAS_REUTILIZAR"));
								vo.setGrupoFamiliar(rs
										.getString("GRUPO_FAMILIAR"));
								vo.setValidarEstud(rs
										.getString("VALIDAR_CONTRA_ESTUD"));
								vo.setValidarSisben(rs
										.getString("VALIDAR_CONTRA_SISBEN"));
								vo.setDirBenObligatoria(rs
										.getString("DIRECCION_BEN_OBLIGATORIA"));
								vo.setValorUnitarioBeneficio(rs
										.getString("VALOR_UNITARIO_BENEFICIO"));
								vo.setDesdeVigencia(rs
										.getString("DESDE_VIGENCIA"));
								vo.setHastaVigencia(rs
										.getString("HASTA_VIGENCIA"));
								vo.setVigencia(rs.getString("VIGENCIA"));
								vo.setCodePrograma(new Long(rs
										.getLong("COD_PROGRAMA")));
								vo.setNombrePrograma(rs
										.getString("NOM_PROGRAMA"));
								vo.setCodeUsuario(new Long(rs
										.getLong("COD_USUARIO")));
								vo.setNombreUsuario(rs.getString("NOM_USUARIO"));
								vo.setCodeCategoria(new Long(rs
										.getLong("COD_CATEGORIA")));
								vo.setDescCategoria(rs
										.getString("NOM_CATEGORIA"));
								return vo;
							}
						});
		return subprogramas;
	}

	public Collection<SubprogramaVO> findInformacionSubprogramaByCriteria(
			SubprogramaVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "SELECT subpro.CODIGO,subpro.NOMBRE, subpro.DESCRIPCION, "
				+ "subpro.DIAS_REUTILIZAR, subpro.CAMPO_A3 DIAS_RENOVAR, subpro.CAMPO_A4 para_empresa, subpro.GRUPO_FAMILIAR, subpro.VALIDAR_CONTRA_ESTUD, "
				+ "subpro.VALIDAR_CONTRA_SISBEN, subpro.DIRECCION_BEN_OBLIGATORIA, nvl(subpro.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
				+ "to_char(subpro.DESDE_VIGENCIA,'dd/mm/rrrr')DESDE_VIGENCIA, "
				+ "to_char(subpro.HASTA_VIGENCIA,'dd/mm/rrrr')HASTA_VIGENCIA , subpro.VIGENCIA, "
				+ "subpro.AREA_CODIGO, area.NOMBRE NOM_AREA, subpro.COMENTARIO, "
				+ "pro.CODIGO COD_PROGRAMA, "
				+ "pro.NOMBRE NOM_PROGRAMA, usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, "
				+ "vflex.CODIGO COD_CATEGORIA, vflex.DESCRIPCION NOM_CATEGORIA "
				+ "FROM TCS_BEN_SUBPROGRAMA subpro, "
				+ "TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, "
				+ "paoyer.TCS_USUARIO usu, "
				+ "paoyer.TCS_VALOR_FLEXIBLE vflex "
				+ "WHERE subpro.PRG_CODIGO = pro.CODIGO "
				+ "AND subpro.USU_CODIGO = usu.CODIGO "
				+ "AND area.CODIGO = subpro.AREA_CODIGO "
				+ "AND vflex.CODIGO (+)= subpro.VFL_CODIGO_CATEGORIA ";

		StringBuffer query = new StringBuffer(strSql);

		if (criteria.getCode() != null) {
			query.append("AND subpro.CODIGO = :subpro.CODIGO ");
			namedParameters.put("subpro.CODIGO", criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append("AND subpro.NOMBRE LIKE :subpro.NOMBRE ");
			namedParameters.put("subpro.NOMBRE", "%"
					+ criteria.getNombre().toUpperCase().trim() + "%");
		}
		if (criteria.getCodePrograma() != null) {
			query.append("AND pro.CODIGO = :pro.CODIGO ");
			namedParameters.put("pro.CODIGO", criteria.getCodePrograma());
		}
		query.append(" ORDER BY subpro.NOMBRE");
		System.out.println(query);
		System.out.println(namedParameters.toString());

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<SubprogramaVO>() {

							public SubprogramaVO mapRow(ResultSet rst,
									int rowNum) throws SQLException {
								SubprogramaVO vo = new SubprogramaVO();
								vo.setCode(new Long(rst.getLong("CODIGO")));
								vo.setNombre(rst.getString("NOMBRE"));
								vo.setDescripcion(rst.getString("DESCRIPCION"));
								vo.setDiasReutilizar(rst
										.getString("DIAS_REUTILIZAR"));
								vo.setDiasRenovacion(rst
										.getString("DIAS_RENOVAR"));
								vo.setCampoA4(rst.getString("PARA_EMPRESA"));
								vo.setGrupoFamiliar(rst
										.getString("GRUPO_FAMILIAR"));
								vo.setValidarEstud(rst
										.getString("VALIDAR_CONTRA_ESTUD"));
								vo.setValidarSisben(rst
										.getString("VALIDAR_CONTRA_SISBEN"));
								vo.setDirBenObligatoria(rst
										.getString("DIRECCION_BEN_OBLIGATORIA"));
								vo.setValorUnitarioBeneficio(rst
										.getString("VALOR_UNITARIO_BENEFICIO"));
								vo.setDesdeVigencia(rst
										.getString("DESDE_VIGENCIA"));
								vo.setHastaVigencia(rst
										.getString("HASTA_VIGENCIA"));
								vo.setVigencia(rst.getString("VIGENCIA"));
								vo.setCodePrograma(new Long(rst
										.getLong("COD_PROGRAMA")));
								vo.setNombrePrograma(rst
										.getString("NOM_PROGRAMA"));
								vo.setCodeUsuario(new Long(rst
										.getLong("COD_USUARIO")));
								vo.setNombreUsuario(rst
										.getString("NOM_USUARIO"));
								vo.setCodeCategoria(new Long(rst
										.getLong("COD_CATEGORIA")));
								vo.setDescCategoria(rst
										.getString("NOM_CATEGORIA"));
								vo.setCodeArea(new Long(rst
										.getLong("AREA_CODIGO")));
								vo.setNombreArea(rst.getString("NOM_AREA"));
								vo.setComentario(rst.getString("COMENTARIO"));
								return vo;
							}
						});
		return subprogramas;
	}

	public Collection<SubprogramaVO> findSubprogramaByCriteria(
			SubprogramaVO criteria, Long codeUser, String groupUserName,
			Long areaUser) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "SELECT DISTINCT CODIGO,NOMBRE,DESCRIPCION,DIAS_REUTILIZAR,GRUPO_FAMILIAR, "
				+ "VALIDAR_CONTRA_ESTUD,VALIDAR_CONTRA_SISBEN,DIRECCION_BEN_OBLIGATORIA,nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
				+ "DESDE_VIGENCIA,HASTA_VIGENCIA,VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, "
				+ "COD_USUARIO,NOM_USUARIO,COD_CATEGORIA, NOM_CATEGORIA "
				+ "FROM VCS_BEN_SUBPROGRAMAS ";

		StringBuffer query = new StringBuffer(strSql);

		if ((Object) codeUser != null) {
			query.append(" WHERE (ususede = :codeUser OR 'ADMINISTRADOR GENERAL' = :groupUserName OR 'SUPER USUARIO' = :groupUserName OR admSubpro = :codeUser OR admProg = :codeUser ");

			namedParameters.put("codeUser", codeUser);
			namedParameters.put("groupUserName", groupUserName);

			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" or AREA_CODIGO = :AREA_CODIGO ");
				namedParameters.put("AREA_CODIGO", areaUser);
			}
			query.append(" ) ");
		} else {
			return null;
		}

		if (criteria.getCode() != null) {
			query.append(" AND CODIGO = :CODIGO ");
			namedParameters.put("CODIGO", criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append(" AND NOMBRE LIKE :NOMBRE ");
			namedParameters.put("NOMBRE", "%"
					+ criteria.getNombre().toUpperCase().trim() + "%");
		}
		if (criteria.getCodePrograma() != null
				&& criteria.getCodePrograma().longValue() != 0) {
			query.append(" AND COD_PROGRAMA = :COD_PROGRAMA ");
			namedParameters.put("COD_PROGRAMA", criteria.getCodePrograma());
		}
		if (criteria.getCodeArea() != null) {
			query.append(" AND AREA_CODIGO = :AREA_CODIGO ");
			namedParameters.put("AREA_CODIGO", criteria.getCodeArea());
		}
		query.append("ORDER BY NOMBRE");

		System.out.println(query.toString());
		System.out.println(namedParameters.toString());

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<SubprogramaVO>() {

							public SubprogramaVO mapRow(ResultSet rs, int rowNum)
									throws SQLException {
								SubprogramaVO vo = new SubprogramaVO();
								vo.setCode(new Long(rs.getLong("CODIGO")));
								vo.setNombre(rs.getString("NOMBRE"));
								vo.setDescripcion(rs.getString("DESCRIPCION"));
								vo.setDiasReutilizar(rs
										.getString("DIAS_REUTILIZAR"));
								vo.setGrupoFamiliar(rs
										.getString("GRUPO_FAMILIAR"));
								vo.setValidarEstud(rs
										.getString("VALIDAR_CONTRA_ESTUD"));
								vo.setValidarSisben(rs
										.getString("VALIDAR_CONTRA_SISBEN"));
								vo.setDirBenObligatoria(rs
										.getString("DIRECCION_BEN_OBLIGATORIA"));
								vo.setValorUnitarioBeneficio(rs
										.getString("VALOR_UNITARIO_BENEFICIO"));
								vo.setDesdeVigencia(rs
										.getString("DESDE_VIGENCIA"));
								vo.setHastaVigencia(rs
										.getString("HASTA_VIGENCIA"));
								vo.setVigencia(rs.getString("VIGENCIA"));
								vo.setCodePrograma(new Long(rs
										.getLong("COD_PROGRAMA")));
								vo.setNombrePrograma(rs
										.getString("NOM_PROGRAMA"));
								vo.setCodeUsuario(new Long(rs
										.getLong("COD_USUARIO")));
								vo.setNombreUsuario(rs.getString("NOM_USUARIO"));
								vo.setCodeCategoria(new Long(rs
										.getLong("COD_CATEGORIA")));
								vo.setDescCategoria(rs
										.getString("NOM_CATEGORIA"));
								return vo;
							}
						});
		return subprogramas;
	}

	public Collection<SubprogramaVO> findAllowedSubprogramaWithGestorByCriteria(
			SubprogramaVO criteria, Long codeUser, String groupUserName,
			Long areaUser) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "SELECT DISTINCT a.CODIGO,  a.NOMBRE,  a.DESCRIPCION, a.DIAS_REUTILIZAR, "
				+ " a.GRUPO_FAMILIAR, a.VALIDAR_CONTRA_ESTUD,  a.VALIDAR_CONTRA_SISBEN, "
				+ " a.DIRECCION_BEN_OBLIGATORIA, nvl(a.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, a.DESDE_VIGENCIA, "
				+ " a.HASTA_VIGENCIA, a.VIGENCIA,a.COD_PROGRAMA, a.NOM_PROGRAMA, a.COD_CATEGORIA, "
				+ " a.NOM_CATEGORIA, a.COD_AREA "
				+ " FROM VCS_BEN_SUBPROG_ALLOWED a, TCS_BEN_SUBP_ATR_BENEFICIARIO sab ";

		StringBuffer query = new StringBuffer(strSql);

		if ((Object) codeUser != null) {
			query.append(" WHERE ( 'ADMINISTRADOR GENERAL' = :groupUserName OR 'SUPER USUARIO' = :groupUserName OR admSubpro = :codeUser OR admProg = :codeUser OR a.permisos = :codeUser ");

			namedParameters.put("groupUserName", groupUserName);
			namedParameters.put("codeUser", codeUser);

			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR a.cod_area = :a.cod_area ");
				namedParameters.put("a.cod_area", areaUser);
			}
			query.append(" ) ");
		} else {
			return null;
		}

		if (criteria.getCode() != null) {
			query.append(" AND a.CODIGO = :a.CODIGO ");
			namedParameters.put("a.CODIGO", criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append(" AND a.NOMBRE LIKE :a.NOMBRE ");
			namedParameters.put("a.NOMBRE", "%"
					+ criteria.getNombre().toUpperCase().trim() + "%");
		}
		if (criteria.getCodePrograma() != null) {
			query.append(" AND a.COD_PROGRAMA = :a.COD_PROGRAMA ");
			namedParameters.put("a.COD_PROGRAMA", criteria.getCodePrograma());
		}
		if (criteria.getCodeArea() != null) {
			query.append(" AND (a.cod_area = :a.cod_area ) ");
			namedParameters.put("a.cod_area", criteria.getCodeArea());
		}
		query.append(" AND a.CODIGO = sab.sbpr_codigo AND UPPER(TRIM(sab.nombre)) = 'GESTOR' ");
		query.append(" AND a.VIGENCIA = 'A' ORDER BY NOMBRE");

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<SubprogramaVO>() {

							public SubprogramaVO mapRow(ResultSet rs, int rowNum)
									throws SQLException {
								SubprogramaVO vo = new SubprogramaVO();
								vo.setCode(new Long(rs.getLong("CODIGO")));
								vo.setNombre(rs.getString("NOMBRE"));
								vo.setDescripcion(rs.getString("DESCRIPCION"));
								vo.setDiasReutilizar(rs
										.getString("DIAS_REUTILIZAR"));
								vo.setGrupoFamiliar(rs
										.getString("GRUPO_FAMILIAR"));
								vo.setValidarEstud(rs
										.getString("VALIDAR_CONTRA_ESTUD"));
								vo.setValidarSisben(rs
										.getString("VALIDAR_CONTRA_SISBEN"));
								vo.setDirBenObligatoria(rs
										.getString("DIRECCION_BEN_OBLIGATORIA"));
								vo.setValorUnitarioBeneficio(rs
										.getString("VALOR_UNITARIO_BENEFICIO"));
								vo.setDesdeVigencia(rs
										.getString("DESDE_VIGENCIA"));
								vo.setHastaVigencia(rs
										.getString("HASTA_VIGENCIA"));
								vo.setVigencia(rs.getString("VIGENCIA"));
								vo.setCodePrograma(new Long(rs
										.getLong("COD_PROGRAMA")));
								vo.setNombrePrograma(rs
										.getString("NOM_PROGRAMA"));
								vo.setCodeCategoria(new Long(rs
										.getLong("COD_CATEGORIA")));
								vo.setDescCategoria(rs
										.getString("NOM_CATEGORIA"));
								return vo;
							}
						});
		return subprogramas;
	}

	public Collection<SubprogramaVO> findSubprograma(SubprogramaVO criteria,
			Long codeUser, String groupUserName, Long areaUser) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "SELECT DISTINCT COD_SUBPRO,  NOM_SUBPRO,  DESC_SUBPRO, FCS_BEN_TIENE_SEDE(COD_SUBPRO) TIENE_SEDE, "
				+ "DREU_SUBPRO,  GRFAM_SUBPRO, VCR_SUBPRO, "
				+ " VCS_SUBPRO, DIROBL_SUBPRO, VALOR_SUBPRO, "
				+ " DESDE_SUBPRO, HASTA_SUBPRO, VIGENCIA_SUBPRO,COD_PROGRAMA, "
				+ "NOM_PROGRAMA, COD_USUARIO, NOM_USUARIO, "
				+ "COD_CATEGORIA,  NOM_CATEGORIA, cod_area, cod_area_prog "
				+ "FROM VCS_BEN_SOLO_SUBPROG_EST_VIG ";

		StringBuffer query = new StringBuffer(strSql);

		if ((Object) codeUser != null) {
			query.append(" WHERE ( 'ADMINISTRADOR GENERAL' = :groupUserName OR 'SUPER USUARIO' = :groupUserName OR admSubpro = :codeUser OR admProg = :codeUser ");

			namedParameters.put("groupUserName", groupUserName);
			namedParameters.put("codeUser", codeUser);

			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR cod_area_prog = :cod_area_prog ");
				namedParameters.put("cod_area_prog", areaUser);
			}
			query.append(" ) ");
		} else {
			return null;
		}

		if (criteria.getCode() != null) {
			query.append(" AND COD_SUBPRO = :COD_SUBPRO ");
			namedParameters.put("COD_SUBPRO", criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append(" AND NOM_SUBPRO LIKE :NOM_SUBPRO ");
			namedParameters.put("NOM_SUBPRO", "%"
					+ criteria.getNombre().toUpperCase().trim() + "%");
		}
		if (criteria.getCodePrograma() != null) {
			query.append(" AND COD_PROGRAMA = :COD_PROGRAMA ");
			namedParameters.put("COD_PROGRAMA", criteria.getCodePrograma());
		}
		if (criteria.getCodeArea() != null) {
			query.append(" AND (cod_area = :cod_area OR cod_area_prog = :cod_area_prog ) ");
			namedParameters.put("cod_area", criteria.getCodeArea());
			namedParameters.put("cod_area_prog", criteria.getCodeArea());
		}
		query.append(" ORDER BY NOM_SUBPRO");

		System.out.println("query: " + query.toString());
		for (String str : namedParameters.keySet()) {
			System.out.println(str + ":" + namedParameters.get(str));
		}

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<SubprogramaVO>() {

							public SubprogramaVO mapRow(ResultSet rs, int rowNum)
									throws SQLException {
								SubprogramaVO vo = new SubprogramaVO();
								vo.setCode(rs.getLong("COD_SUBPRO"));
								vo.setNombre(rs.getString("NOM_SUBPRO"));
								vo.setDescripcion(rs.getString("DESC_SUBPRO"));
								vo.setDiasReutilizar(rs
										.getString("DREU_SUBPRO"));
								vo.setGrupoFamiliar(rs
										.getString("GRFAM_SUBPRO"));
								vo.setValidarEstud(rs.getString("VCR_SUBPRO"));
								vo.setValidarSisben(rs.getString("VCS_SUBPRO"));
								vo.setDirBenObligatoria(rs
										.getString("DIROBL_SUBPRO"));
								vo.setValorUnitarioBeneficio(rs
										.getString("VALOR_SUBPRO"));
								vo.setDesdeVigencia(rs
										.getString("DESDE_SUBPRO"));
								vo.setHastaVigencia(rs
										.getString("HASTA_SUBPRO"));
								vo.setVigencia(rs.getString("VIGENCIA_SUBPRO"));
								vo.setCodePrograma(rs.getLong("COD_PROGRAMA"));
								vo.setNombrePrograma(rs
										.getString("NOM_PROGRAMA"));
								vo.setCodeUsuario(rs.getLong("COD_USUARIO"));
								vo.setNombreUsuario(rs.getString("NOM_USUARIO"));
								vo.setCodeCategoria(rs.getLong("COD_CATEGORIA"));
								vo.setDescCategoria(rs
										.getString("NOM_CATEGORIA"));
								vo.setTieneSede(rs.getString("TIENE_SEDE"));
								return vo;
							}
						});
		return subprogramas;
	}

	public Collection<SubprogramaVO> findAllowedSubprograma(
			SubprogramaVO criteria, Long codeUser, String groupUserName,
			Long areaUser) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "SELECT DISTINCT CODIGO,  NOMBRE,  DESCRIPCION, DIAS_REUTILIZAR, "
				+ " GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD,  VALIDAR_CONTRA_SISBEN, "
				+ " DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, DESDE_VIGENCIA, "
				+ " HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, COD_CATEGORIA, "
				+ " NOM_CATEGORIA, COD_AREA "
				+ " FROM VCS_BEN_SUBPROG_ALLOWED a ";

		StringBuffer query = new StringBuffer(strSql);

		if ((Object) codeUser != null) {
			query.append(" WHERE ( 'ADMINISTRADOR GENERAL' = :groupUserName OR 'SUPER USUARIO' = :groupUserName OR admSubpro = :codeUser OR admProg = :codeUser OR a.permisos = :codeUser ");

			namedParameters.put("groupUserName", groupUserName);
			namedParameters.put("codeUser", codeUser);

			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR cod_area = :cod_area ");
				namedParameters.put("cod_area", areaUser);
			}
			query.append(" ) ");
		} else
			return null;

		if (criteria.getCode() != null) {
			query.append(" AND CODIGO = :CODIGO ");
			namedParameters.put("CODIGO", criteria.getCode());
		}
		if (!criteria.getNombre().equalsIgnoreCase("")) {
			query.append(" AND NOMBRE LIKE :NOMBRE ");
			namedParameters.put("NOMBRE", "%"
					+ criteria.getNombre().toUpperCase().trim() + "%");
		}
		if (criteria.getCodePrograma() != null) {
			query.append(" AND COD_PROGRAMA = :COD_PROGRAMA ");
			namedParameters.put("COD_PROGRAMA", criteria.getCodePrograma());
		}
		if (criteria.getCodeArea() != null) {
			query.append(" AND (cod_area = :cod_area ) ");
			namedParameters.put("cod_area", criteria.getCodeArea());
		}
		query.append(" AND a.VIGENCIA = 'A' ORDER BY NOMBRE");

		System.out.println(query);
		System.out.println(namedParameters.toString());

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<SubprogramaVO>() {

							public SubprogramaVO mapRow(ResultSet rs, int rowNum)
									throws SQLException {
								SubprogramaVO vo = new SubprogramaVO();
								vo.setCode(new Long(rs.getLong("CODIGO")));
								vo.setNombre(rs.getString("NOMBRE"));
								vo.setDescripcion(rs.getString("DESCRIPCION"));
								vo.setDiasReutilizar(rs
										.getString("DIAS_REUTILIZAR"));
								vo.setGrupoFamiliar(rs
										.getString("GRUPO_FAMILIAR"));
								vo.setValidarEstud(rs
										.getString("VALIDAR_CONTRA_ESTUD"));
								vo.setValidarSisben(rs
										.getString("VALIDAR_CONTRA_SISBEN"));
								vo.setDirBenObligatoria(rs
										.getString("DIRECCION_BEN_OBLIGATORIA"));
								vo.setValorUnitarioBeneficio(rs
										.getString("VALOR_UNITARIO_BENEFICIO"));
								vo.setDesdeVigencia(rs
										.getString("DESDE_VIGENCIA"));
								vo.setHastaVigencia(rs
										.getString("HASTA_VIGENCIA"));
								vo.setVigencia(rs.getString("VIGENCIA"));
								vo.setCodePrograma(rs.getLong("COD_PROGRAMA"));
								vo.setNombrePrograma(rs
										.getString("NOM_PROGRAMA"));
								vo.setCodeCategoria(rs.getLong("COD_CATEGORIA"));
								vo.setDescCategoria(rs
										.getString("NOM_CATEGORIA"));
								return vo;
							}
						});
		return subprogramas;
	}

	public int insertBeneficioOtorgado(String[] strArr, int i,
			String fechaBeneficio) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String queryFecha = "SELECT TO_CHAR((SELECT TO_DATE(:fechaBeneficio,'dd/mm/RRRR') FROM dual)+:i,'dd/mm/RRRR') fecha FROM dual ";
		String fecha;

		namedParameters.put("fechaBeneficio", fechaBeneficio);
		namedParameters.put("i", i);

		try {
			fecha = getNamedParameterJdbcTemplate().queryForObject(queryFecha,
					namedParameters, String.class);
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
			// si no hay results.
			fecha = "sysdate";
		}

		namedParameters.clear();

		String query = "INSERT INTO TCS_BEN_BENEFICIO_OTORGADO (CODIGO, SBPR_CODIGO, "
				+ " BEN_CODIGO, SEDE_CODIGO, TERCERO, FECHA_BENEFICIO, CAMPO_F1, VALOR_BENEFICIO, TIPO_BENEFICIO, "
				+ " USUARIO_CREA, TERMINAL_CREA, USUARIO_MODIFICA, TERMINAL_MODIFICA, HECHO_VICTIMIZANTE) "
				+ " VALUES(SCS_BEN_BOT.NEXTVAL, :SBPR_CODIGO, :BEN_CODIGO, :SEDE_CODIGO, :TERCERO, TO_DATE(:FECHA_BENEFICIO,'dd/mm/RRRR'), TO_DATE(sysdate,'dd/mm/RRRR'), :VALOR_BENEFICIO, :TIPO_BENEFICIO, :USUARIO_CREA, :TERMINAL_CREA, :USUARIO_MODIFICA, :TERMINAL_MODIFICA, :HECHO_VICTIMIZANTE)";

		namedParameters.put("SBPR_CODIGO", new Long(strArr[0]).longValue());// sbpr_codigo
		namedParameters.put("BEN_CODIGO", new Long(strArr[1]).longValue());// ben_codigo
		namedParameters.put("SEDE_CODIGO", new Long(strArr[2]).longValue());// sede_codigo
		namedParameters.put("TERCERO", strArr[3]);// tercero
		namedParameters.put("FECHA_BENEFICIO", fecha);// fecha_beneficio
		namedParameters.put("VALOR_BENEFICIO", strArr[4]);// valor_beneficio
		namedParameters.put("TIPO_BENEFICIO", strArr[5]);// tipo_beneficio
		namedParameters.put("USUARIO_CREA", strArr[6]);// usuario_crea
		namedParameters.put("TERMINAL_CREA", strArr[7]);// terminal_crea
		namedParameters.put("USUARIO_MODIFICA", strArr[8]);// usuario_modifica
		namedParameters.put("TERMINAL_MODIFICA", strArr[9]);// terminal_modifica
		try {
			namedParameters.put("HECHO_VICTIMIZANTE", strArr[10]);// hecho_victimizante
		} catch (IndexOutOfBoundsException e) {
			namedParameters.put("HECHO_VICTIMIZANTE", null);
		}

		return getNamedParameterJdbcTemplate().update(query, namedParameters);
	}

	// TODO: test for BigDecimal or Integer
	public int updateBeneficioOtorgado(String[] strArr, int i,
			String dateBenefit, String codeBot) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT TO_CHAR((SELECT TO_DATE(:fechaBeneficio,'dd/mm/RRRR') FROM dual)+:i,'dd/mm/RRRR') fecha FROM dual ";
		String fecha;

		namedParameters.put("fechaBeneficio", dateBenefit);
		namedParameters.put("i", i);

		try {
			fecha = getNamedParameterJdbcTemplate().queryForObject(query,
					namedParameters, String.class);
		} catch (IncorrectResultSizeDataAccessException e) {
			fecha = "sysdate";
		}
		namedParameters.clear();

		namedParameters.put("codigoSede", new Long(strArr[0]));
		namedParameters.put("terceroParam", strArr[1] == null ? "" : strArr[1]);
		namedParameters.put("fechaBeneficio", fecha);
		namedParameters.put("valorBeneficio", new Long(strArr[2]));
		namedParameters.put("usuarioModif", strArr[3]);
		namedParameters.put("terminalModif", strArr[4]);
		namedParameters.put("codigoBOT", new Long(codeBot));

		SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(getJdbcTemplate())
				.withSchemaName("BENEFICIOS").withProcedureName(
						PCS_BEN_UPDATE_BOT);

		SqlParameterSource in = new MapSqlParameterSource()
				.addValues(namedParameters);

		BigDecimal bigDec = simpleJdbcCall.executeObject(BigDecimal.class, in);

		return bigDec.intValue();

	}

	public int updateBeneficioOtorgado(String[] strArr, int i,
			String dateBenefit, String codeBot, String tipoBot,
			Long codigoHechoVictimizante) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT TO_CHAR((SELECT TO_DATE(:fechaBeneficio,'dd/mm/RRRR') FROM dual)+:i,'dd/mm/RRRR') fecha FROM dual ";
		String fecha;

		namedParameters.put("fechaBeneficio", dateBenefit);
		namedParameters.put("i", i);

		try {
			fecha = getNamedParameterJdbcTemplate().queryForObject(query,
					namedParameters, String.class);
		} catch (IncorrectResultSizeDataAccessException e) {
			fecha = "sysdate";
		}

		namedParameters.clear();

		namedParameters.put("codigoSede", strArr[0]);
		namedParameters.put("terceroParam", strArr[1] == null ? "" : strArr[1]);
		namedParameters.put("fechaBeneficio", fecha);
		namedParameters.put("valorBeneficio",
				(strArr[2] == null || strArr[2].isEmpty()) ? null : strArr[2]);
		namedParameters.put("tipoBeneficio", tipoBot);
		namedParameters.put("codigoHechoVictimizante", codigoHechoVictimizante);
		namedParameters.put("usuarioModif", strArr[3]);
		namedParameters.put("terminalModif", strArr[4]);
		namedParameters.put("codigoBOT", codeBot);

		SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(getDataSource())
				.withProcedureName(PCS_BEN_UPDATE_BOT_NEWTP);

		SqlParameterSource in = new MapSqlParameterSource(namedParameters);
		try {
			BigDecimal bigDec = simpleJdbcCall.executeObject(BigDecimal.class,
					in);
			if (bigDec != null) {
				return bigDec.intValue();
			}
		} catch (Exception e) {
		}
		return 0;

	}

	public SubprogramaVO findPropiedadesSubprograma(long codeSubpro) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT DIAS_REUTILIZAR,CAMPO_A3 FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", codeSubpro);
		SubprogramaVO subpro = null;

		try {
			subpro = getNamedParameterJdbcTemplate().queryForObject(query,
					namedParameters, new RowMapper<SubprogramaVO>() {

						public SubprogramaVO mapRow(ResultSet rst, int rowNum)
								throws SQLException {
							SubprogramaVO subpro = new SubprogramaVO();
							subpro.setDiasReutilizar(rst
									.getString("DIAS_REUTILIZAR"));
							subpro.setDiasRenovacion(rst.getString("CAMPO_A3"));
							return subpro;
						}
					});
			return subpro;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
			return subpro;
		}
	}

	public String findCodMaxBenOtor() {
		String codigo = "";
		String strSql = "SELECT SCS_BEN_BOT.currval CODEMAX FROM dual";

		try {
			codigo = getNamedParameterJdbcTemplate().getJdbcOperations()
					.queryForObject(strSql, String.class);
			return codigo;
		} catch (IncorrectResultSizeDataAccessException e) {
			return codigo;
		}
	}

	public String findCantidadDisponible() {
		String codigo = "";
		String strSql = "SELECT MAX(CODIGO) CODEMAX FROM TCS_BEN_BENEFICIO_OTORGADO";

		try {
			codigo = getNamedParameterJdbcTemplate().getJdbcOperations()
					.queryForObject(strSql, String.class);
			return codigo;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
		}
		return codigo;
	}

	public String findMaxCodigo() {
		String codigo = "";
		String strSql = "Select MAX(codigo) max_codigo FROM tcs_ben_subprograma";

		try {
			codigo = getNamedParameterJdbcTemplate().getJdbcOperations()
					.queryForObject(strSql, String.class);
			return codigo;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
		}
		return codigo;
	}

	public int insertBeneficio(SubprogramaForm subform, String user,
			String strTerminal, String strDate) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = " Insert INTO tcs_ben_subprograma (CODIGO, PRG_CODIGO, USU_CODIGO, "
				+ " NOMBRE, DESCRIPCION, DIAS_REUTILIZAR, GRUPO_FAMILIAR, "
				+ " VALIDAR_CONTRA_ESTUD, VALIDAR_CONTRA_SISBEN, VALOR_UNITARIO_BENEFICIO, "
				+ " DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA, AREA_CODIGO,CAMPO_A3, CAMPO_A1, CAMPO_A4, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " values (SCS_BEN_SBPR.NEXTVAL, :PRG_CODIGO, :USU_CODIGO, UPPER(:NOMBRE), UPPER(:DESCRIPCION), :DIAS_REUTILIZAR, :GRUPO_FAMILIAR, :VALIDAR_CONTRA_ESTUD, :VALIDAR_CONTRA_SISBEN, :VALOR_UNITARIO_BENEFICIO, TO_DATE(:DESDE_VIGENCIA,'dd/mm/rrrr'), TO_DATE(:HASTA_VIGENCIA,'dd/mm/rrrr'), 'A', :AREA_CODIGO, :CAMPO_A3, :CAMPO_A1, :CAMPO_A4, :usuario_crea, TO_DATE(:fecha_crea,'dd/mm/rrrr'), :terminal_crea, :usuario_modifica, TO_DATE(:fecha_modifica,'dd/mm/rrrr'), :terminal_modifica) ";

		namedParameters.put("PRG_CODIGO", subform.getCodePrograma());
		namedParameters.put("USU_CODIGO", subform.getAdmincodigo1());
		namedParameters.put("NOMBRE", subform.getSubprograma().trim());
		namedParameters.put("DESCRIPCION", subform.getDescripcion());
		namedParameters.put("DIAS_REUTILIZAR", subform.getDias());
		namedParameters.put("GRUPO_FAMILIAR", subform.getGrupfam());
		namedParameters.put("VALIDAR_CONTRA_ESTUD", "N");
		namedParameters.put("VALIDAR_CONTRA_SISBEN", subform.getSisben());
		namedParameters.put("VALOR_UNITARIO_BENEFICIO", subform.getValor());
		namedParameters.put("DESDE_VIGENCIA", subform.getDesde());
		namedParameters.put("HASTA_VIGENCIA", subform.getHasta());
		namedParameters.put("AREA_CODIGO", subform.getSubsecretaria());
		namedParameters.put("CAMPO_A3", subform.getDiasrenovar());
		namedParameters.put("CAMPO_A1", subform.getSolounavez());
		namedParameters.put("CAMPO_A4", subform.getParaEmpresa());
		namedParameters.put("usuario_crea", user);
		namedParameters.put("fecha_crea", strDate);
		namedParameters.put("terminal_crea", strTerminal);
		namedParameters.put("usuario_modifica", user);
		namedParameters.put("fecha_modifica", strDate);
		namedParameters.put("terminal_modifica", strTerminal);

		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
		SqlParameterSource parameterSource = new MapSqlParameterSource(
				namedParameters);
		getNamedParameterJdbcTemplate().update(query, parameterSource,
				generatedKeyHolder, new String[] { "CODIGO" });

		return generatedKeyHolder.getKey().intValue();

		// return getNamedParameterJdbcTemplate().update(query,
		// namedParameters);
	}

	public boolean findEstadoSubprogramaByCodigo(long codigo) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT  codigo FROM tcs_ben_subprograma WHERE  vigencia = 'I' AND codigo = :codigo ";

		namedParameters.put("codigo", codigo);

		try {
			String code = getNamedParameterJdbcTemplate().queryForObject(query,
					namedParameters, String.class);
			if (code != null) {
				return true;
			}
			return false;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
			return false;
		}
	}

	public Collection<SubprogramaVO> findActivarSubprogramas(long codePrograma) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = " SELECT sub.nombre nombre, sub.codigo codigo, prog.nombre nombrepro "
				+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog "
				+ " WHERE (sub.vigencia <> 'A' OR SYSDATE > sub.HASTA_VIGENCIA) AND sub.PRG_CODIGO = prog.CODIGO AND "
				+ " prog.codigo = :prog.codigo ";

		namedParameters.put("prog.codigo", codePrograma);

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query, namedParameters, new RowMapper<SubprogramaVO>() {

					public SubprogramaVO mapRow(ResultSet rs, int arg1)
							throws SQLException {
						SubprogramaVO vo = new SubprogramaVO();
						vo.setCode(new Long(rs.getString("codigo")));
						vo.setNombre(rs.getString("nombre"));
						vo.setNombrePrograma(rs.getString("nombrepro"));
						return vo;
					}
				});
		return subprogramas;
	}

	public Collection<SubprogramaVO> findActivarSubprogramas(Long codeUser,
			String groupUserName, Long areaUser) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT * FROM VCS_BEN_SOLO_SUBPROGRAMAS ");
		if ((Object) codeUser != null) {
			query.append(" WHERE ( 'ADMINISTRADOR GENERAL' = :groupUserName OR 'SUPER USUARIO' = :groupUserName OR admSubpro = :codeUser OR admProg = :codeUser ");

			namedParameters.put("groupUserName", groupUserName);
			namedParameters.put("codeUser", codeUser);

			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR AREA_CODIGO = :AREA_CODIGO ");
				namedParameters.put("AREA_CODIGO", areaUser);
			}
			query.append(" ) ");
		}
		query.append(" AND (VIGENCIA_SUBPRO = 'I' OR sysdate > HASTA_SUBPRO) ");

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<SubprogramaVO>() {

							public SubprogramaVO mapRow(ResultSet rs, int rowNum)
									throws SQLException {
								SubprogramaVO vo = new SubprogramaVO();
								vo.setCode(rs.getLong("COD_SUBPRO"));
								vo.setNombre(rs.getString("NOM_SUBPRO"));
								vo.setNombrePrograma(rs
										.getString("NOM_PROGRAMA"));
								return vo;
							}
						});
		return subprogramas;
	}

	public Collection<SubprogramaVO> findSubprogramasVigentes(
			SubprogramaVO criteria, Long codeUser, String groupUserName,
			Long areaUser) {
		Map<String, Object> namedParametes = new HashMap<String, Object>();

		StringBuffer query = new StringBuffer(
				"SELECT DISTINCT CODIGO, NOMBRE, DESCRIPCION, "
						+ "DIAS_REUTILIZAR, GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD, "
						+ "VALIDAR_CONTRA_SISBEN, DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
						+ "DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, "
						+ "NOM_PROGRAMA, COD_CATEGORIA,  NOM_CATEGORIA, AREA_CODIGO "
						+ "FROM VCS_BEN_SUBPROG_ALLOWED ");
		if ((Object) codeUser != null) {
			query.append(" WHERE ( 'ADMINISTRADOR GENERAL' = :groupUserName OR 'SUPER USUARIO' = :groupUserName OR admSubpro = :codeUser OR admProg = :codeUser ");

			namedParametes.put("groupUserName", groupUserName);
			namedParametes.put("codeUser", codeUser);

			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR AREA_CODIGO = :AREA_CODIGO ");
				namedParametes.put("AREA_CODIGO", areaUser);
			}
			query.append(" ) ");
		} else {
			return null;
		}
		if (criteria.getCode() != null) {
			query.append(" AND CODIGO = :CODIGO ");
			namedParametes.put("CODIGO", criteria.getCode());
		}
		if (criteria.getCodePrograma() != null
				&& criteria.getCodePrograma().longValue() != 0) {
			query.append(" AND COD_PROGRAMA = :COD_PROGRAMA ");
			namedParametes.put("COD_PROGRAMA", criteria.getCodePrograma());
		}
		if (areaUser != null && areaUser.longValue() != 0) {
			query.append(" AND (AREA_CODIGO = :AREA_CODIGO) ");
			namedParametes.put("AREA_CODIGO", areaUser);
		}
		query.append(" AND VIGENCIA <> 'I' ORDER BY NOMBRE");

		List<SubprogramaVO> subprogramas = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParametes,
						new RowMapper<SubprogramaVO>() {

							public SubprogramaVO mapRow(ResultSet rs, int rowNum)
									throws SQLException {
								SubprogramaVO vo = new SubprogramaVO();
								vo.setCode(rs.getLong("CODIGO"));
								vo.setNombre(rs.getString("NOMBRE"));
								vo.setDescripcion(rs.getString("DESCRIPCION"));
								vo.setDiasReutilizar(rs
										.getString("DIAS_REUTILIZAR"));
								vo.setGrupoFamiliar(rs
										.getString("GRUPO_FAMILIAR"));
								vo.setValidarEstud(rs
										.getString("VALIDAR_CONTRA_ESTUD"));
								vo.setValidarSisben(rs
										.getString("VALIDAR_CONTRA_SISBEN"));
								vo.setDirBenObligatoria(rs
										.getString("DIRECCION_BEN_OBLIGATORIA"));
								vo.setValorUnitarioBeneficio(rs
										.getString("VALOR_UNITARIO_BENEFICIO"));
								vo.setDesdeVigencia(rs
										.getString("DESDE_VIGENCIA"));
								vo.setHastaVigencia(rs
										.getString("HASTA_VIGENCIA"));
								vo.setVigencia(rs.getString("VIGENCIA"));
								vo.setCodePrograma(rs.getLong("COD_PROGRAMA"));
								vo.setNombrePrograma(rs
										.getString("NOM_PROGRAMA"));
								vo.setCodeCategoria(rs.getLong("COD_CATEGORIA"));
								vo.setDescCategoria(rs
										.getString("NOM_CATEGORIA"));
								return vo;
							}
						});
		return subprogramas;
	}

	public String findNombreByCodigo(long codeSub) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();
		String strName = null;

		String query = "SELECT nombre FROM tcs_ben_subprograma WHERE codigo = :codigo ";

		namedParameters.put("codigo", codeSub);

		try {
			strName = getNamedParameterJdbcTemplate().queryForObject(query,
					namedParameters, String.class);
			return strName;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
			return strName;
		}
	}

	public String findCodigoSubprogramaByCodigoBOT(long codeBOT) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = " SELECT SBPR_CODIGO FROM TCS_BEN_BENEFICIO_OTORGADO WHERE codigo = :codigo ";

		namedParameters.put("codigo", codeBOT);
		System.out.println(query);
		System.out.println(namedParameters.toString());
		String codigo = getNamedParameterJdbcTemplate().queryForObject(query,
				namedParameters, String.class);
		return codigo;
	}

	public boolean isRelacionadoConSede(long codeSub) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = " SELECT COUNT(DISTINCT CODIGO) Cantidad FROM VCS_BEN_SUBPROGRAMAS WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", codeSub);

		int cantidad = getNamedParameterJdbcTemplate().queryForObject(query,
				namedParameters, Integer.class);
		return cantidad == 0 ? false : true;
	}

	public String findCodigoProgramaByCodigoSubprograma(long codeSubprograma) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT PRG_CODIGO FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO = :CODIGO ";

		namedParameters.put("CODIGO", codeSubprograma);

		String code = getNamedParameterJdbcTemplate().queryForObject(query,
				namedParameters, String.class);
		return code;
	}

	public boolean isSubprogramaParaGrupoFamiliar(Long codeSubprograma) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		namedParameters.put("CODIGO", codeSubprograma);

		try {
			String code = getNamedParameterJdbcTemplate().queryForObject(
					SELECT_GF_FROM_TCS_BEN_SUBPROG_BY_CODESUBP,
					namedParameters, String.class);
			return true;
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
			return false;
		}
	}

	public SubprogramaVO findSubprogramaByCodigo(Long codeSubprograma) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = "SELECT subp.codigo, subp.prg_codigo, subp.usu_codigo, subp.area_codigo, subp.nombre, subp.descripcion, subp.dias_reutilizar, "
				+ " subp.grupo_familiar, subp.validar_contra_sisben, subp.direccion_ben_obligatoria, subp.valor_unitario_beneficio, "
				+ " subp.desde_vigencia, subp.hasta_vigencia, subp.vigencia, "
				+ " prog.nombre programa_nombre "
				+ " FROM tcs_ben_subprograma subp "
				+ " JOIN tcs_ben_programa prog "
				+ " ON subp.prg_codigo = prog.codigo WHERE subp.codigo = :CODIGO ";
		namedParameters.put("CODIGO", codeSubprograma);
		SubprogramaVO subprograma = null;
		try {
			subprograma = getNamedParameterJdbcTemplate().queryForObject(
					strSql, namedParameters, new RowMapper<SubprogramaVO>() {

						public SubprogramaVO mapRow(ResultSet rs, int rowNum)
								throws SQLException {
							SubprogramaVO vo = new SubprogramaVO();
							vo.setCode(rs.getLong("CODIGO"));
							vo.setCodePrograma(rs.getLong("PRG_CODIGO"));
							vo.setCodeUsuario(rs.getLong("USU_CODIGO"));
							vo.setCodeArea(rs.getLong("AREA_CODIGO"));
							vo.setNombre(rs.getString("NOMBRE"));
							vo.setDescripcion(rs.getString("DESCRIPCION"));
							vo.setDiasReutilizar(rs
									.getString("DIAS_REUTILIZAR"));
							vo.setGrupoFamiliar(rs.getString("GRUPO_FAMILIAR"));
							vo.setValidarSisben(rs
									.getString("VALIDAR_CONTRA_SISBEN"));
							vo.setDirBenObligatoria(rs
									.getString("DIRECCION_BEN_OBLIGATORIA"));
							vo.setValorUnitarioBeneficio(rs
									.getString("VALOR_UNITARIO_BENEFICIO"));
							vo.setDesdeVigencia(rs.getString("DESDE_VIGENCIA"));
							vo.setHastaVigencia(rs.getString("HASTA_VIGENCIA"));
							vo.setVigencia(rs.getString("VIGENCIA"));

							vo.setNombrePrograma(rs
									.getString("PROGRAMA_NOMBRE"));
							return vo;
						}
					});

		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
		}
		return subprograma;

	}

	public int insertBeneficioOtorgadoEmpresa(String[] strArr, int i,
			String fechaBeneficio) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String queryFecha = "SELECT TO_CHAR((SELECT TO_DATE(:fechaBeneficio,'dd/mm/RRRR') FROM dual)+:i,'dd/mm/RRRR') fecha FROM dual ";
		String fecha;

		namedParameters.put("fechaBeneficio", fechaBeneficio);
		namedParameters.put("i", i);

		fecha = getNamedParameterJdbcTemplate().queryForObject(queryFecha,
				namedParameters, String.class);

		if (fecha == null || fecha.isEmpty()) {
			fecha = "sysdate";
		}

		// TODO: ben_codigo
		String query = "INSERT INTO TCS_BEN_BENEFICIO_OTORGADO (CODIGO, SBPR_CODIGO, "
				+ " BEN_CODIGO, SEDE_CODIGO, TERCERO, FECHA_BENEFICIO, CAMPO_F1, VALOR_BENEFICIO, TIPO_BENEFICIO, "
				+ " USUARIO_CREA, TERMINAL_CREA, USUARIO_MODIFICA, TERMINAL_MODIFICA, CAMPO_N3) "
				+ " VALUES(SCS_BEN_BOT.NEXTVAL, :SBPR_CODIGO, :BEN_CODIGO, "
				+ " :SEDE_CODIGO, :TERCERO, TO_DATE(:FECHA_BENEFICIO,'dd/mm/RRRR'), "
				+ " TO_DATE(sysdate,'dd/mm/RRRR'), :VALOR_BENEFICIO, :TIPO_BENEFICIO, :USUARIO_CREA, "
				+ " :TERMINAL_CREA, :USUARIO_MODIFICA, :TERMINAL_MODIFICA, :CAMPO_N3)";

		namedParameters.put("SBPR_CODIGO", new Long(strArr[0]).longValue());
		namedParameters.put("BEN_CODIGO", 7693004); // hack
		namedParameters.put("SEDE_CODIGO", new Long(strArr[2]).longValue());
		namedParameters.put("TERCERO", strArr[3]);
		namedParameters.put("FECHA_BENEFICIO", fecha);
		namedParameters.put("VALOR_BENEFICIO", strArr[4]);
		namedParameters.put("TIPO_BENEFICIO", strArr[5]);
		namedParameters.put("USUARIO_CREA", strArr[6]);
		namedParameters.put("TERMINAL_CREA", strArr[7]);
		namedParameters.put("USUARIO_MODIFICA", strArr[8]);
		namedParameters.put("TERMINAL_MODIFICA", strArr[9]);
		namedParameters.put("CAMPO_N3", strArr[1]);

		return getNamedParameterJdbcTemplate().update(query, namedParameters);

	}

	@Override
	public int inactivarSubprograma(SubprogramaVO subprogramaVO) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = " UPDATE tcs_ben_subprograma SET vigencia ='I', "
				+ " COMENTARIO = :COMENTARIO, "
				+ " USUARIO_MODIFICA = :USUARIO_MODIFICA, "
				+ " FECHA_MODIFICA = TO_DATE(:FECHA_MODIFICA,'dd/mm/yyyy'), "
				+ " TERMINAL_MODIFICA = :TERMINAL_MODIFICA WHERE CODIGO = :CODIGO ";

		namedParameters.put("COMENTARIO", subprogramaVO.getComentario());
		namedParameters.put("USUARIO_MODIFICA",
				subprogramaVO.getUsuarioModifica());
		namedParameters.put("FECHA_MODIFICA", subprogramaVO.getFechaModifica());
		namedParameters.put("TERMINAL_MODIFICA",
				subprogramaVO.getTerminalModifica());
		namedParameters.put("CODIGO", subprogramaVO.getCode());

		return getNamedParameterJdbcTemplate().update(query, namedParameters);

	}

	@Override
	public int update(SubprogramaVO subprogramaVO) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSql = " UPDATE tcs_ben_subprograma SET USU_CODIGO = :USU_CODIGO, NOMBRE = UPPER(:NOMBRE), "
				+ " PRG_CODIGO = :PRG_CODIGO, DESCRIPCION = UPPER(:DESCRIPCION), DIAS_REUTILIZAR = :DIAS_REUTILIZAR,  GRUPO_FAMILIAR = :GRUPO_FAMILIAR, "
				+ " VALIDAR_CONTRA_ESTUD = :VALIDAR_CONTRA_ESTUD, VALIDAR_CONTRA_SISBEN = :VALIDAR_CONTRA_SISBEN, "
				+ " VALOR_UNITARIO_BENEFICIO = :VALOR_UNITARIO_BENEFICIO, DESDE_VIGENCIA = TO_DATE(:DESDE_VIGENCIA,'dd/mm/rrrr'), "
				+ " HASTA_VIGENCIA = TO_DATE(:HASTA_VIGENCIA,'dd/mm/rrrr'), VIGENCIA = :VIGENCIA, AREA_CODIGO = :AREA_CODIGO, CAMPO_A3 = :CAMPO_A3, "
				+ " USUARIO_MODIFICA = :USUARIO_MODIFICA, FECHA_MODIFICA = TO_DATE(:FECHA_MODIFICA,'dd/mm/rrrr'), "
				+ " TERMINAL_MODIFICA = :TERMINAL_MODIFICA, CAMPO_A4 = :PARA_EMPRESA WHERE CODIGO = :CODIGO ";
		namedParameters.put("USU_CODIGO", subprogramaVO.getCodeUsuario());
		namedParameters.put("NOMBRE", subprogramaVO.getNombre());
		namedParameters.put("PRG_CODIGO", subprogramaVO.getCodePrograma());
		namedParameters.put("DESCRIPCION", subprogramaVO.getDescripcion());
		namedParameters.put("DIAS_REUTILIZAR",
				subprogramaVO.getDiasReutilizar());
		namedParameters.put("GRUPO_FAMILIAR", subprogramaVO.getGrupoFamiliar());
		namedParameters.put("VALIDAR_CONTRA_ESTUD",
				subprogramaVO.getValidarEstud());
		namedParameters.put("VALIDAR_CONTRA_SISBEN",
				subprogramaVO.getValidarSisben());
		namedParameters.put("VALOR_UNITARIO_BENEFICIO",
				subprogramaVO.getValorUnitarioBeneficio());
		namedParameters.put("DESDE_VIGENCIA", subprogramaVO.getDesdeVigencia());
		namedParameters.put("HASTA_VIGENCIA", subprogramaVO.getHastaVigencia());
		namedParameters.put("VIGENCIA", subprogramaVO.getVigencia());
		namedParameters.put("AREA_CODIGO", subprogramaVO.getCodeArea());
		namedParameters.put("CAMPO_A3", subprogramaVO.getCampoA3());
		namedParameters.put("USUARIO_MODIFICA",
				subprogramaVO.getUsuarioModifica());
		namedParameters.put("FECHA_MODIFICA", subprogramaVO.getFechaModifica());
		namedParameters.put("TERMINAL_MODIFICA",
				subprogramaVO.getTerminalModifica());
		namedParameters.put("PARA_EMPRESA", subprogramaVO.getCampoA4());
		namedParameters.put("CODIGO", subprogramaVO.getCode());

		return getNamedParameterJdbcTemplate().update(strSql, namedParameters);
	}
}
